﻿#pragma execution_character_set("utf-8")
#include "database.h"
#include <QDebug>
#define DATA_BASE_NAME ("sql.db")//数据库文件名
QSqlDatabase DataBasePri::database;

/*!
 * @brief 数据库连接对象构造函数
 * @note 实现SQLite数据库连接池管理：
 * 1. 检查已有连接复用
 * 2. 新建连接时指定驱动类型和连接名
 * 3. 配置数据库基本参数
 */
DataBasePri::DataBasePri()
{
    // 连接池管理：存在同名连接则复用
    if (QSqlDatabase::contains("sqllite")) {
        database = QSqlDatabase::database("sqllite");
    } else {
        // 创建新数据库连接，指定SQLite驱动和连接名
        database = QSqlDatabase::addDatabase("QSQLITE","sqllite");
    }
    database.setDatabaseName("sql.db");//设置数据库文件名
    database.setUserName("root");//用户
    database.setPassword("nopassword");//密码-无密码
    if (! database.open()){//打开数据库
        qCritical() << database.lastError().text();
        return;
    }

    QSqlQuery query(database);
    /*!
 * @brief 初始化系统表结构
 * @note 执行顺序：
 * 1. 创建管理员表user_information
 * 2. 插入默认管理员账号
 * 3. 创建用户表user
 * 4. 插入测试用户数据
 * @warning SQL语句使用fromLocal8Bit需注意编码一致性
 */
    // 管理员用户表初始化
    bool ret = query.exec(QString::fromLocal8Bit("create table user_information(name varchar(50) primary key,passwd varchar(20))"));
    query.exec(QString::fromLocal8Bit("insert into user_information values('admin','passwd')"));
    
    /*! @note 普通用户表结构：
     * - phone作为主键
     * - 包含基础个人信息字段
     */
    // 用户表初始化
    ret = query.exec(QString::fromLocal8Bit("create table user(phone varchar(50) primary key,name varchar(50),passwd varchar(50),age varchar(50),sex varchar(50))"));
    ret = query.exec(QString::fromLocal8Bit("insert into user values('17645452342','唐冠东','17645452342','23','男')"));
    ret = query.exec(QString::fromLocal8Bit("insert into user values('15546514109','张三','15546514109','22','女')"));


    qDebug()<<"ddddddddd"<<ret;
    qDebug()<<"ddddddddd"<<query.lastError();
    database.close();
}

DataBasePri::~DataBasePri()
{

}

/*!
 * @brief 执行全表查询
 * @param tablename 目标表名
 * @return 二维数组形式的结果集
 * @note 实现细节：
 * 1. 动态拼接SQL语句需注意注入风险
 * 2. 硬编码40列字段遍历
 * 3. 自动管理数据库连接
 * @warning 当前实现：
 * - 字段数量硬编码为40列
 * - 未处理字段索引越界问题
 * - 建议改用record().count()动态获取列数
 */
QVector<QVector<QString>> DataBasePri::queryAll(QString tablename)
{
    // 自动打开数据库连接
    if (! DataBasePri::database.open()){
        qCritical() << DataBasePri::database.lastError().text();
    }
    QSqlQuery query(DataBasePri::database);
    QString statement = QString("SELECT * FROM %1").arg(tablename);
    query.exec(statement);
    QVector<QVector<QString>> retvector;
    QVector<QString> vectorstr;
    int midsize = 0;
    
    // 遍历查询结果（硬编码40列）
    while(query.next())
    {
        vectorstr.clear();
        midsize = query.size();
        /*! @note 当前采用硬编码字段遍历：
         * - 固定遍历40个字段
         * - 实际字段数可能不一致
         * - 建议改进为动态获取字段数
         */
        for(int i = 0; i < 40;i++ ){
            vectorstr.append(query.value(i).toByteArray());
        }
        retvector.append(vectorstr);
    }
    DataBasePri::database.close();
    return retvector;
}
